/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package Persistencia;

import DAO.AccessDatabase;
import Objetos.OS;
import Objetos.Os_funcionarioServico;
import Objetos.Usuario;
import Objetos.ValoresFixos;
import java.awt.HeadlessException;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.sql.Statement;
import java.sql.Types;
import java.util.Calendar;
import java.util.Vector;
import javax.swing.JOptionPane;
import javax.swing.JTable;

/**
 *
 * @author celiobj
 */
public class RepositorioOS implements RepositorioOSInterface {

    @Override
    public void adicionar(OS orcamento,Usuario usu) {

        try {
            AccessDatabase a = new AccessDatabase();
            Connection con = a.conectar();
            Statement st = con.createStatement();
            st.execute("INSERT INTO `os` (`valor`, `placa`, `status`, `dataEntrega`, `dataInclusao`, `cliente`) VALUES ('" + orcamento.getValor() + "', '" + orcamento.getPlaca() + "', '" + orcamento.getStatus() + "', '" + orcamento.getDataEntrega() + "', '" + orcamento.getDataInclusao() + "', '" + orcamento.getCliente() + "');");
            JOptionPane.showMessageDialog(null, "Ordem de Serviço lançada com sucesso!!!");
        } catch (SQLException ex) {

            System.out.println(ex.getMessage());
        }

    }

    @Override
    public void encerrar(String codOrcamento,Usuario usu) {

        Calendar data = Calendar.getInstance();
        String dataEncerramento = Funcoes.funcoes.paraInserirData(data.getTime().toLocaleString().substring(0, 10));
        try {

            AccessDatabase a = new AccessDatabase();
            Connection con = a.conectar();
            Statement st = con.createStatement();
            st.executeUpdate("UPDATE os SET status= '"+ValoresFixos.StatusOS.fechada.getStatus()+"', dataEntrega='"+dataEncerramento+"' WHERE idOS = '" + codOrcamento + "'");
            con.close();

            JOptionPane.showMessageDialog(null, "O.S. finalizada com sucesso!!!");

        } catch (HeadlessException | SQLException t) {
            System.out.println(t.getMessage());

        }

    }

    @Override
    public OS procurar(String codOrcamento,Usuario usu) {
        try {

            AccessDatabase a = new AccessDatabase();
            Connection con = a.conectar();
            Statement st = con.createStatement();
            ResultSet rs = st.executeQuery("SELECT valor, placa, cliente,dataInclusao,dataEntrega,status FROM os  WHERE idOS = '" + codOrcamento + "'");
            rs.next();

            OS os = new OS();
            os.setValor(rs.getString("valor"));
            os.setPlaca(rs.getString("placa"));
            os.setCliente(rs.getString("cliente"));
            os.setDataInclusao(rs.getString("dataInclusao"));
            os.setDataEntrega(rs.getString("dataEntrega"));
            os.setStatus(rs.getString("status"));

            con.close();
            return os;

        } catch (SQLException t) {
            System.out.println(t.getMessage());
            return null;

        }

    }

    @Override
    public JTable listarAbertosPorData(String dataInicio, String dataFim,Usuario usu) {
        throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
    }

    @Override
    public JTable listarFechadosPorData(String dataInicio, String dataFim,Usuario usu) {
        try {
            String inicioF = Funcoes.funcoes.paraInserirData(dataInicio);
            String fimF = Funcoes.funcoes.paraInserirData(dataFim);
            Vector cabecalho = new Vector();
            Vector linhas = new Vector();
            AccessDatabase a = new AccessDatabase();
            Connection con = a.conectar();
            Statement st = con.createStatement();
            ResultSet rs = st.executeQuery("SELECT o.idOS, c.idcliente, c.nomecliente, o.dataEntrega, o.valor "
                    + "FROM os o, clientes c "
                    + "where c.idcliente= o.cliente and o.status ='"+ValoresFixos.StatusOS.fechada.getStatus()+"' "
                    + "and o.dataEntrega between " + inicioF + " and " + fimF + " order by o.dataEntrega, o.idOS");
            rs.next();

            ResultSetMetaData rsmd = rs.getMetaData();
            cabecalho.addElement("O.S.");
            cabecalho.addElement("Cód Cli");
            cabecalho.addElement("Cliente");
            cabecalho.addElement("Data entrega");
            cabecalho.addElement("Valor");

            do {
                linhas.addElement(proximaLinha(rs, rsmd));
            } while (rs.next());

            JTable tabela = new JTable(linhas, cabecalho);

            tabela.getColumnModel().getColumn(0).setPreferredWidth(50);
            tabela.getColumnModel().getColumn(1).setPreferredWidth(80);
            tabela.getColumnModel().getColumn(2).setPreferredWidth(250);
            tabela.getColumnModel().getColumn(3).setPreferredWidth(100);
            tabela.getColumnModel().getColumn(4).setPreferredWidth(150);

            con.close();
            return tabela;

        } catch (SQLException t) {
            System.out.println(t.getMessage());
            return null;

        }

    }

    private Vector proximaLinha(ResultSet rs, ResultSetMetaData rsmd) throws SQLException {
        Vector LinhaAtual = new Vector();

        try {
            for (int i = 1; i <= rsmd.getColumnCount(); ++i) {
                switch (rsmd.getColumnType(i)) {
                    case Types.BIGINT:
                        LinhaAtual.addElement(rs.getInt(i));
                        break;
                    case Types.VARCHAR:
                        LinhaAtual.addElement(rs.getString(i));
                        break;
                    case Types.TIMESTAMP:
                        LinhaAtual.addElement(rs.getDate(i).toLocaleString().substring(0, 10));
                        break;
                    case Types.INTEGER:
                        LinhaAtual.addElement(rs.getInt(i));
                        break;
                    case Types.DECIMAL:
                        LinhaAtual.addElement(Funcoes.funcoes.paraFormatoDinheiro(rs.getDouble(i)));
                        break;
                    case Types.DOUBLE:
                        LinhaAtual.addElement(Funcoes.funcoes.paraFormatoDinheiro(rs.getDouble(i)));
                        break;
                    case Types.DATE:
                        LinhaAtual.addElement(Funcoes.funcoes.paraRecuperarData(rs.getDate(i).toString()));
                        break;

                }
            }
        } catch (SQLException e) {
        }
        return LinhaAtual;

    }

    @Override
    public JTable listarTodosAbertos(Usuario usu) {

        try {
            Vector cabecalho = new Vector();
            Vector linhas = new Vector();
            AccessDatabase a = new AccessDatabase();
            Connection con = a.conectar();
            Statement st = con.createStatement();
            ResultSet rs = st.executeQuery("SELECT o.idOS, o.placa, o.cliente, c.nomecliente, v.modelo, o.dataEntrega, o.valor FROM bd_oficinasimples.os o, bd_oficinasimples.veiculos v, clientes c where c.idcliente = o.cliente and o.status = '"+ValoresFixos.StatusOS.aberta.getStatus()+"' and v.placa = o.placa order by dataEntrega;");
            rs.next();

            ResultSetMetaData rsmd = rs.getMetaData();
            cabecalho.addElement("OS");
            cabecalho.addElement("Placa");
            cabecalho.addElement("Cód. cli.");
            cabecalho.addElement("Cliente");
            cabecalho.addElement("Modelo");
            cabecalho.addElement("Data Entrega");
            cabecalho.addElement("Valor");

            do {
                linhas.addElement(proximaLinha(rs, rsmd));
            } while (rs.next());

            JTable tabela = new JTable(linhas, cabecalho);

            tabela.getColumnModel().getColumn(0).setPreferredWidth(50);
            tabela.getColumnModel().getColumn(1).setPreferredWidth(100);
            tabela.getColumnModel().getColumn(2).setPreferredWidth(50);
            tabela.getColumnModel().getColumn(3).setPreferredWidth(250);
            tabela.getColumnModel().getColumn(4).setPreferredWidth(320);
            tabela.getColumnModel().getColumn(5).setPreferredWidth(100);
            tabela.getColumnModel().getColumn(6).setPreferredWidth(100);

            con.close();
            return tabela;

        } catch (Exception t) {
            System.out.println(t.getMessage());
            return null;

        }

    }

    @Override
    public void inserirServicosOS(Os_funcionarioServico servicos,Usuario usu) {

        try {
            AccessDatabase a = new AccessDatabase();
            Connection con = a.conectar();
            Statement st = con.createStatement();
            st.execute("INSERT INTO `os_funcionario_servico` (`idOS`, `idfuncionario`, `servico`,`peca`) VALUES ('" + servicos.getIdOs() + "', '" + servicos.getIdFuncionario() + "', '" + servicos.getServico() + "', '" + servicos.getPeca() + "');");
           
        } catch (SQLException ex) {

            System.out.println(ex.getMessage());
        }

    }

    @Override
    public int pegarUltima(Usuario usu) {

        int retorno = 0;
        try {

            AccessDatabase a = new AccessDatabase();
            Connection con = a.conectar();
            Statement st = con.createStatement();
            ResultSet rs = st.executeQuery("SELECT MAX(idOS) FROM os");
            rs.next();
            if (rs.getRow() == 0) {
                con.close();
                return 0;
            } else {
                retorno = Integer.parseInt(rs.getString("MAX(idOS)"));
                con.close();
                return retorno;
            }
        } catch (Exception t) {
            System.out.println(t.getMessage());
            return 0;

        }

    }

    @Override
    public JTable filtrarServicosOS(String codOs,Usuario usu) {

        try {
            Vector cabecalho = new Vector();
            Vector linhas = new Vector();
            AccessDatabase a = new AccessDatabase();
            Connection con = a.conectar();
            Statement st = con.createStatement();
            ResultSet rs = st.executeQuery("SELECT osf.peca, osf.servico, osf.idfuncionario, f.nomefuncionario FROM os_funcionario_servico osf, funcionarios f where f.idfuncionario = osf.idfuncionario and idOS = '" + codOs + "';");
            rs.next();

            ResultSetMetaData rsmd = rs.getMetaData();
            cabecalho.addElement("Peça");
            cabecalho.addElement("Serviço");
            cabecalho.addElement("Cód. func.");
            cabecalho.addElement("Funcionário");

            do {
                linhas.addElement(proximaLinha(rs, rsmd));
            } while (rs.next());

            JTable tabela = new JTable(linhas, cabecalho);

            tabela.getColumnModel().getColumn(0).setPreferredWidth(120);
            tabela.getColumnModel().getColumn(1).setPreferredWidth(120);
            tabela.getColumnModel().getColumn(2).setPreferredWidth(50);
            tabela.getColumnModel().getColumn(3).setPreferredWidth(120);

            con.close();
            return tabela;

        } catch (Exception t) {
            System.out.println(t.getMessage());
            return null;

        }

    }

    @Override
    public double somarPedidos(String inicio, String fim,Usuario usu) {

        Double retorno;
        try {

            String inicioF = Funcoes.funcoes.paraInserirData(inicio);
            String fimF = Funcoes.funcoes.paraInserirData(fim);
            AccessDatabase a = new AccessDatabase();
            Connection con = a.conectar();
            Statement st = con.createStatement();
            ResultSet rs = st.executeQuery("Select round(sum(valor),2) from os where dataEntrega between " + inicioF + " and " + fimF + " and status = '"+ValoresFixos.StatusOS.fechada.getStatus()+"';");
            rs.next();
            if (rs.getRow() == 0) {
                con.close();
                return 0.0;
            } else {

                retorno = (rs.getDouble("round(sum(valor),2)"));
                con.close();
                return retorno;

            }
        } catch (SQLException t) {
            System.out.println(t.getMessage());
            return 0.0;

        }

    }

    @Override
    public JTable calcularGastosPorPeríodo(String inicio, String fim, Usuario usu) {
       try {
            String inicioF = Funcoes.funcoes.paraInserirData(inicio);
            String fimF = Funcoes.funcoes.paraInserirData(fim);
            Vector cabecalho = new Vector();
            Vector linhas = new Vector();
            AccessDatabase a = new AccessDatabase();
            Connection con = a.conectar();
            Statement st = con.createStatement();
            ResultSet rs = st.executeQuery("SELECT o.idOS, c.idcliente, c.nomecliente, o.dataInclusao, o.valor, (SELECT  sum(p.valorproduto * pos.qtd) FROM produto_os pos, produtos p WHERE p.idproduto=pos.idproduto and pos.idOS = o.idOS) "
                    + "FROM os o, clientes c "
                    + "where c.idcliente= o.cliente and o.status ='"+ValoresFixos.StatusOS.fechada.getStatus()+"' "
                    + "and o.dataEntrega between " + inicioF + " and " + fimF + " order by o.dataEntrega, o.idOS");
            rs.next();

            ResultSetMetaData rsmd = rs.getMetaData();
            cabecalho.addElement("O.S.");
            cabecalho.addElement("Cód Cli");
            cabecalho.addElement("Cliente");
            cabecalho.addElement("Data");
            cabecalho.addElement("Valor");
            cabecalho.addElement("Gasto");

            do {
                linhas.addElement(proximaLinha(rs, rsmd));
            } while (rs.next());

            JTable tabela = new JTable(linhas, cabecalho);

            tabela.getColumnModel().getColumn(0).setPreferredWidth(50);
            tabela.getColumnModel().getColumn(1).setPreferredWidth(80);
            tabela.getColumnModel().getColumn(2).setPreferredWidth(250);
            tabela.getColumnModel().getColumn(3).setPreferredWidth(100);
            tabela.getColumnModel().getColumn(4).setPreferredWidth(150);
            tabela.getColumnModel().getColumn(5).setPreferredWidth(150);

            con.close();
            
            return tabela;

        } catch (SQLException t) {
            System.out.println(t.getMessage());
            return null;

        }

    }

}
